Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / frontend / js / networkVisualiserWebGL.js

Displaying Raw • Download


meshchatx/src/frontend/js/networkVisualiserWebGL.js 95b90a707d698c14a2c1fcca3bf31f66ceca41eb (95b90a70) Text, 15.96 KB

T8b949e/**
* WebGL2 canvas renderer for MeshChatX network visualiser.
* Draws instanced circular sprites (textured when available) and line edges.
*/

T8b949e/** WASM / scene pack: x y size r g b a kind */
Tff7b72export Tff7b72const Te6edf3SCENE_NODE_STRIDE Tff7b72= T79c0ff8Tb4b4b4;
T8b949e/** Draw instance: x y size r g b a useTex u v */
Tff7b72export Tff7b72const Te6edf3NODE_STRIDE Tff7b72= T79c0ff10Tb4b4b4;
Tff7b72export Tff7b72const Te6edf3EDGE_STRIDE Tff7b72= T79c0ff8Tb4b4b4;

Tff7b72const Te6edf3ATLAS_CELL Tff7b72= T79c0ff64Tb4b4b4;
Tff7b72const Te6edf3ATLAS_COLS Tff7b72= T79c0ff16Tb4b4b4;
Tff7b72const Te6edf3ATLAS_ROWS Tff7b72= T79c0ff16Tb4b4b4;
Tff7b72const Te6edf3ATLAS_CAPACITY Tff7b72= Te6edf3ATLAS_COLS Tff7b72* Te6edf3ATLAS_ROWSTb4b4b4;

Tff7b72const Te6edf3NODE_VS Tff7b72= Ta5d6ff`Ta5d6ff#version 300 es
layout(location=0) in vec2 a_corner;
layout(location=1) in vec2 a_center;
layout(location=2) in float a_size;
layout(location=3) in vec4 a_color;
layout(location=4) in float a_useTex;
layout(location=5) in vec2 a_uvOrigin;
uniform vec2 u_resolution;
uniform vec2 u_camera;
uniform float u_zoom;
out vec4 v_color;
out vec2 v_uv;
out float v_useTex;
out vec2 v_uvOrigin;
void main() {
v_uv = a_corner;
v_color = a_color;
v_useTex = a_useTex;
v_uvOrigin = a_uvOrigin;
float r = max(a_size, 2.0);
vec2 world = a_center + a_corner * r;
vec2 screen = (world - u_camera) * u_zoom + u_resolution * 0.5;
vec2 clip = (screen / u_resolution) * 2.0 - 1.0;
clip.y = -clip.y;
gl_Position = vec4(clip, 0.0, 1.0);
}
Ta5d6ff`Tb4b4b4;

Tff7b72const Te6edf3NODE_FS Tff7b72= Ta5d6ff`Ta5d6ff#version 300 es
precision mediump float;
in vec4 v_color;
in vec2 v_uv;
in float v_useTex;
in vec2 v_uvOrigin;
uniform sampler2D u_atlas;
uniform vec2 u_cellUv;
out vec4 outColor;
void main() {
float d = length(v_uv);
if (d > 1.0) discard;
float edge = smoothstep(1.0, 0.72, d);
if (v_useTex > 0.5) {
vec2 local = v_uv * 0.5 + 0.5;
vec2 texUV = v_uvOrigin + local * u_cellUv;
vec4 tex = texture(u_atlas, texUV);
float a = tex.a * edge * v_color.a;
if (a < 0.01) discard;
outColor = vec4(tex.rgb, a);
} else {
outColor = vec4(v_color.rgb, v_color.a * edge);
}
}
Ta5d6ff`Tb4b4b4;

Tff7b72const Te6edf3EDGE_VS Tff7b72= Ta5d6ff`Ta5d6ff#version 300 es
layout(location=0) in vec2 a_pos;
layout(location=1) in vec4 a_color;
uniform vec2 u_resolution;
uniform vec2 u_camera;
uniform float u_zoom;
out vec4 v_color;
void main() {
v_color = a_color;
vec2 screen = (a_pos - u_camera) * u_zoom + u_resolution * 0.5;
vec2 clip = (screen / u_resolution) * 2.0 - 1.0;
clip.y = -clip.y;
gl_Position = vec4(clip, 0.0, 1.0);
}
Ta5d6ff`Tb4b4b4;

Tff7b72const Te6edf3EDGE_FS Tff7b72= Ta5d6ff`Ta5d6ff#version 300 es
precision mediump float;
in vec4 v_color;
out vec4 outColor;
void main() {
outColor = v_color;
}
Ta5d6ff`Tb4b4b4;

Tff7b72function Te6edf3compileTb4b4b4(Te6edf3glTb4b4b4, Te6edf3typeTb4b4b4, Te6edf3srcTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3sh Tff7b72= Te6edf3glTb4b4b4.Te6edf3createShaderTb4b4b4(Te6edf3typeTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3shaderSourceTb4b4b4(Te6edf3shTb4b4b4, Te6edf3srcTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3compileShaderTb4b4b4(Te6edf3shTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3glTb4b4b4.Te6edf3getShaderParameterTb4b4b4(Te6edf3shTb4b4b4, Te6edf3glTb4b4b4.Te6edf3COMPILE_STATUSTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3info Tff7b72= Te6edf3glTb4b4b4.Te6edf3getShaderInfoLogTb4b4b4(Te6edf3shTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteShaderTb4b4b4(Te6edf3shTb4b4b4)Tb4b4b4;
Tff7b72throw Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff`Ta5d6ffWebGL shader: Tffd700${Te6edf3infoTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3shTb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3linkTb4b4b4(Te6edf3glTb4b4b4, Te6edf3vsSrcTb4b4b4, Te6edf3fsSrcTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3vs Tff7b72= Te6edf3compileTb4b4b4(Te6edf3glTb4b4b4, Te6edf3glTb4b4b4.Te6edf3VERTEX_SHADERTb4b4b4, Te6edf3vsSrcTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3fs Tff7b72= Te6edf3compileTb4b4b4(Te6edf3glTb4b4b4, Te6edf3glTb4b4b4.Te6edf3FRAGMENT_SHADERTb4b4b4, Te6edf3fsSrcTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3prog Tff7b72= Te6edf3glTb4b4b4.Te6edf3createProgramTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3attachShaderTb4b4b4(Te6edf3progTb4b4b4, Te6edf3vsTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3attachShaderTb4b4b4(Te6edf3progTb4b4b4, Te6edf3fsTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3linkProgramTb4b4b4(Te6edf3progTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteShaderTb4b4b4(Te6edf3vsTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteShaderTb4b4b4(Te6edf3fsTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3glTb4b4b4.Te6edf3getProgramParameterTb4b4b4(Te6edf3progTb4b4b4, Te6edf3glTb4b4b4.Te6edf3LINK_STATUSTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3info Tff7b72= Te6edf3glTb4b4b4.Te6edf3getProgramInfoLogTb4b4b4(Te6edf3progTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteProgramTb4b4b4(Te6edf3progTb4b4b4)Tb4b4b4;
Tff7b72throw Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff`Ta5d6ffWebGL program: Tffd700${Te6edf3infoTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3progTb4b4b4;
Tb4b4b4}

T8b949e/**
* Merge WASM scene node packs with atlas UVs into draw instances.
* @param {Float32Array|null} sceneNodes SCENE_NODE_STRIDE
* @param {{useTex:number,u:number,v:number}[]} texMeta per-node
* @param {Float32Array} [dst] scratch with length >= count * NODE_STRIDE
* @returns {Float32Array} view of length count * NODE_STRIDE
*/
Tff7b72export Tff7b72function Te6edf3mergeSceneNodesWithTexturesTb4b4b4(Te6edf3sceneNodesTb4b4b4, Te6edf3texMetaTb4b4b4, Te6edf3dstTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3count Tff7b72= Te6edf3sceneNodes Tff7b72&& Te6edf3sceneNodesTb4b4b4.Te6edf3length Tff7b72? Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3sceneNodesTb4b4b4.Te6edf3length Tff7b72/ Te6edf3SCENE_NODE_STRIDETb4b4b4) Tff7b72: T79c0ff0Tb4b4b4;
Tff7b72const Te6edf3need Tff7b72= Te6edf3count Tff7b72* Te6edf3NODE_STRIDETb4b4b4;
Tff7b72const Te6edf3out Tff7b72= Te6edf3dst Tff7b72&& Te6edf3dstTb4b4b4.Te6edf3length Tff7b72>= Te6edf3need Tff7b72? Te6edf3dst Tff7b72: Tff7b72new Tffa657Float32ArrayTb4b4b4(Te6edf3needTb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3countTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3s Tff7b72= Te6edf3i Tff7b72* Te6edf3SCENE_NODE_STRIDETb4b4b4;
Tff7b72const Te6edf3d Tff7b72= Te6edf3i Tff7b72* Te6edf3NODE_STRIDETb4b4b4;
Te6edf3outTb4b4b4[Te6edf3dTb4b4b4] Tff7b72= Te6edf3sceneNodesTb4b4b4[Te6edf3sTb4b4b4]Tb4b4b4;
Te6edf3outTb4b4b4[Te6edf3d Tff7b72+ T79c0ff1Tb4b4b4] Tff7b72= Te6edf3sceneNodesTb4b4b4[Te6edf3s Tff7b72+ T79c0ff1Tb4b4b4]Tb4b4b4;
Te6edf3outTb4b4b4[Te6edf3d Tff7b72+ T79c0ff2Tb4b4b4] Tff7b72= Te6edf3sceneNodesTb4b4b4[Te6edf3s Tff7b72+ T79c0ff2Tb4b4b4]Tb4b4b4;
Te6edf3outTb4b4b4[Te6edf3d Tff7b72+ T79c0ff3Tb4b4b4] Tff7b72= Te6edf3sceneNodesTb4b4b4[Te6edf3s Tff7b72+ T79c0ff3Tb4b4b4]Tb4b4b4;
Te6edf3outTb4b4b4[Te6edf3d Tff7b72+ T79c0ff4Tb4b4b4] Tff7b72= Te6edf3sceneNodesTb4b4b4[Te6edf3s Tff7b72+ T79c0ff4Tb4b4b4]Tb4b4b4;
Te6edf3outTb4b4b4[Te6edf3d Tff7b72+ T79c0ff5Tb4b4b4] Tff7b72= Te6edf3sceneNodesTb4b4b4[Te6edf3s Tff7b72+ T79c0ff5Tb4b4b4]Tb4b4b4;
Te6edf3outTb4b4b4[Te6edf3d Tff7b72+ T79c0ff6Tb4b4b4] Tff7b72= Te6edf3sceneNodesTb4b4b4[Te6edf3s Tff7b72+ T79c0ff6Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3meta Tff7b72= Te6edf3texMetaTff7b72?Tb4b4b4.Tb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4;
Te6edf3outTb4b4b4[Te6edf3d Tff7b72+ T79c0ff7Tb4b4b4] Tff7b72= Te6edf3metaTff7b72?Tb4b4b4.Te6edf3useTex Tff7b72? T79c0ff1 Tff7b72: T79c0ff0Tb4b4b4;
Te6edf3outTb4b4b4[Te6edf3d Tff7b72+ T79c0ff8Tb4b4b4] Tff7b72= Te6edf3metaTff7b72?Tb4b4b4.Te6edf3u Tff7b72?? T79c0ff0Tb4b4b4;
Te6edf3outTb4b4b4[Te6edf3d Tff7b72+ T79c0ff9Tb4b4b4] Tff7b72= Te6edf3metaTff7b72?Tb4b4b4.Te6edf3v Tff7b72?? T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3need Tff7b72=== Te6edf3outTb4b4b4.Te6edf3length Tff7b72? Te6edf3out Tff7b72: Te6edf3outTb4b4b4.Te6edf3subarrayTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3needTb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/**
* Atlas UV origin for a slot index.
* @param {number} slot
* @returns {{u:number,v:number}}
*/
Tff7b72export Tff7b72function Te6edf3atlasUvForSlotTb4b4b4(Te6edf3slotTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3col Tff7b72= Te6edf3slot Tff7b72% Te6edf3ATLAS_COLSTb4b4b4;
Tff7b72const Te6edf3row Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3slot Tff7b72/ Te6edf3ATLAS_COLSTb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{
Te6edf3uTff7b72: Te6edf3col Tff7b72/ Te6edf3ATLAS_COLSTb4b4b4,
Te6edf3vTff7b72: Te6edf3row Tff7b72/ Te6edf3ATLAS_ROWSTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}

T8b949e/**
* @param {HTMLCanvasElement} canvas
* @returns {WebGL2RenderingContext|null}
*/
Tff7b72export Tff7b72function Te6edf3tryCreateWebGL2ContextTb4b4b4(Te6edf3canvasTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3canvas Tff7b72|| Tff7b72typeof Te6edf3canvasTb4b4b4.Te6edf3getContext Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tff7b72return Tff7b72nullTb4b4b4;
Tff7b72try Tb4b4b4{
Tff7b72return Te6edf3canvasTb4b4b4.Te6edf3getContextTb4b4b4(Ta5d6ff"webgl2"Tb4b4b4, Tb4b4b4{
Te6edf3alphaTff7b72: Tff7b72falseTb4b4b4,
Te6edf3antialiasTff7b72: Tff7b72trueTb4b4b4,
Te6edf3depthTff7b72: Tff7b72falseTb4b4b4,
Te6edf3stencilTff7b72: Tff7b72falseTb4b4b4,
Te6edf3powerPreferenceTff7b72: Ta5d6ff"high-performance"Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* @param {WebGL2RenderingContext} gl
*/
Tff7b72function Te6edf3createIconAtlasTb4b4b4(Te6edf3glTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3width Tff7b72= Te6edf3ATLAS_COLS Tff7b72* Te6edf3ATLAS_CELLTb4b4b4;
Tff7b72const Te6edf3height Tff7b72= Te6edf3ATLAS_ROWS Tff7b72* Te6edf3ATLAS_CELLTb4b4b4;
Tff7b72const Te6edf3texture Tff7b72= Te6edf3glTb4b4b4.Te6edf3createTextureTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindTextureTb4b4b4(Te6edf3glTb4b4b4.Te6edf3TEXTURE_2DTb4b4b4, Te6edf3textureTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3texParameteriTb4b4b4(Te6edf3glTb4b4b4.Te6edf3TEXTURE_2DTb4b4b4, Te6edf3glTb4b4b4.Te6edf3TEXTURE_MIN_FILTERTb4b4b4, Te6edf3glTb4b4b4.Te6edf3LINEARTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3texParameteriTb4b4b4(Te6edf3glTb4b4b4.Te6edf3TEXTURE_2DTb4b4b4, Te6edf3glTb4b4b4.Te6edf3TEXTURE_MAG_FILTERTb4b4b4, Te6edf3glTb4b4b4.Te6edf3LINEARTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3texParameteriTb4b4b4(Te6edf3glTb4b4b4.Te6edf3TEXTURE_2DTb4b4b4, Te6edf3glTb4b4b4.Te6edf3TEXTURE_WRAP_STb4b4b4, Te6edf3glTb4b4b4.Te6edf3CLAMP_TO_EDGETb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3texParameteriTb4b4b4(Te6edf3glTb4b4b4.Te6edf3TEXTURE_2DTb4b4b4, Te6edf3glTb4b4b4.Te6edf3TEXTURE_WRAP_TTb4b4b4, Te6edf3glTb4b4b4.Te6edf3CLAMP_TO_EDGETb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3texImage2DTb4b4b4(Te6edf3glTb4b4b4.Te6edf3TEXTURE_2DTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3RGBATb4b4b4, Te6edf3widthTb4b4b4, Te6edf3heightTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3RGBATb4b4b4, Te6edf3glTb4b4b4.Te6edf3UNSIGNED_BYTETb4b4b4, Tff7b72nullTb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3urlToSlot Tff7b72= Tff7b72new Tffa657MapTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3pending Tff7b72= Tff7b72new Tffa657MapTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3freeSlots Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72let Te6edf3nextSlot Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72const Te6edf3scratch Tff7b72= Tff7b72typeof Tffa657document Tff7b72!== Ta5d6ff"undefined" Tff7b72? Tffa657documentTb4b4b4.Te6edf3createElementTb4b4b4(Ta5d6ff"canvas"Tb4b4b4) Tff7b72: Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3scratchTb4b4b4) Tb4b4b4{
Te6edf3scratchTb4b4b4.Te6edf3width Tff7b72= Te6edf3ATLAS_CELLTb4b4b4;
Te6edf3scratchTb4b4b4.Te6edf3height Tff7b72= Te6edf3ATLAS_CELLTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3scratchCtx Tff7b72= Te6edf3scratchTff7b72?Tb4b4b4.Te6edf3getContextTff7b72?Tb4b4b4.Tb4b4b4(Ta5d6ff"2d"Tb4b4b4) Tff7b72|| Tff7b72nullTb4b4b4;

Tff7b72function Te6edf3allocSlotTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3freeSlotsTb4b4b4.Te6edf3length Tff7b72> T79c0ff0Tb4b4b4) Tff7b72return Te6edf3freeSlotsTb4b4b4.Te6edf3popTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3nextSlot Tff7b72>= Te6edf3ATLAS_CAPACITYTb4b4b4) Tff7b72return Tff7b72nullTb4b4b4;
Tff7b72return Te6edf3nextSlotTff7b72++Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3paintSlotTb4b4b4(Te6edf3slotTb4b4b4, Te6edf3sourceTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3scratchCtx Tff7b72|| Tff7b72!Te6edf3scratchTb4b4b4) Tff7b72returnTb4b4b4;
Te6edf3scratchCtxTb4b4b4.Te6edf3clearRectTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3ATLAS_CELLTb4b4b4, Te6edf3ATLAS_CELLTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3sw Tff7b72= Te6edf3sourceTb4b4b4.Te6edf3width Tff7b72|| Te6edf3sourceTb4b4b4.Te6edf3videoWidth Tff7b72|| Te6edf3ATLAS_CELLTb4b4b4;
Tff7b72const Te6edf3sh Tff7b72= Te6edf3sourceTb4b4b4.Te6edf3height Tff7b72|| Te6edf3sourceTb4b4b4.Te6edf3videoHeight Tff7b72|| Te6edf3ATLAS_CELLTb4b4b4;
Tff7b72const Te6edf3scale Tff7b72= Tffa657MathTb4b4b4.Te6edf3minTb4b4b4(Te6edf3ATLAS_CELL Tff7b72/ Te6edf3swTb4b4b4, Te6edf3ATLAS_CELL Tff7b72/ Te6edf3shTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3dw Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff1Tb4b4b4, Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3sw Tff7b72* Te6edf3scaleTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3dh Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff1Tb4b4b4, Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3sh Tff7b72* Te6edf3scaleTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3dx Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tb4b4b4(Te6edf3ATLAS_CELL Tff7b72- Te6edf3dwTb4b4b4) Tff7b72/ T79c0ff2Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3dy Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tb4b4b4(Te6edf3ATLAS_CELL Tff7b72- Te6edf3dhTb4b4b4) Tff7b72/ T79c0ff2Tb4b4b4)Tb4b4b4;
Te6edf3scratchCtxTb4b4b4.Te6edf3drawImageTb4b4b4(Te6edf3sourceTb4b4b4, Te6edf3dxTb4b4b4, Te6edf3dyTb4b4b4, Te6edf3dwTb4b4b4, Te6edf3dhTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3col Tff7b72= Te6edf3slot Tff7b72% Te6edf3ATLAS_COLSTb4b4b4;
Tff7b72const Te6edf3row Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3slot Tff7b72/ Te6edf3ATLAS_COLSTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindTextureTb4b4b4(Te6edf3glTb4b4b4.Te6edf3TEXTURE_2DTb4b4b4, Te6edf3textureTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3pixelStoreiTb4b4b4(Te6edf3glTb4b4b4.Te6edf3UNPACK_FLIP_Y_WEBGLTb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3texSubImage2DTb4b4b4(Te6edf3glTb4b4b4.Te6edf3TEXTURE_2DTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3col Tff7b72* Te6edf3ATLAS_CELLTb4b4b4, Te6edf3row Tff7b72* Te6edf3ATLAS_CELLTb4b4b4, Te6edf3glTb4b4b4.Te6edf3RGBATb4b4b4, Te6edf3glTb4b4b4.Te6edf3UNSIGNED_BYTETb4b4b4, Te6edf3scratchTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3loadImageTb4b4b4(Te6edf3urlTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3resolveTb4b4b4, Te6edf3rejectTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3img Tff7b72= Tff7b72new Te6edf3ImageTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3imgTb4b4b4.Te6edf3decoding Tff7b72= Ta5d6ff"async"Tb4b4b4;
Te6edf3imgTb4b4b4.Te6edf3onload Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3resolveTb4b4b4(Te6edf3imgTb4b4b4)Tb4b4b4;
Te6edf3imgTb4b4b4.Te6edf3onerror Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3rejectTb4b4b4(Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff`Ta5d6fficon load failed: Tffd700${Te6edf3urlTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3imgTb4b4b4.Te6edf3src Tff7b72= Te6edf3urlTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e/**
* @param {string} url
* @returns {Promise<number|null>} slot index or null
*/
Tff7b72async Tff7b72function Te6edf3ensureTb4b4b4(Te6edf3urlTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3url Tff7b72|| Tff7b72typeof Te6edf3url Tff7b72!== Ta5d6ff"string"Tb4b4b4) Tff7b72return Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3urlToSlotTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4) Tff7b72return Te6edf3urlToSlotTb4b4b4.Te6edf3getTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3pendingTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4) Tff7b72return Te6edf3pendingTb4b4b4.Te6edf3getTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3slot Tff7b72= Te6edf3allocSlotTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3slot Tff7b72== Tff7b72nullTb4b4b4) Tff7b72return Tff7b72nullTb4b4b4;
Tff7b72const Te6edf3work Tff7b72= Te6edf3loadImageTb4b4b4(Te6edf3urlTb4b4b4)
Tb4b4b4.Te6edf3thenTb4b4b4(Tb4b4b4(Te6edf3imgTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3paintSlotTb4b4b4(Te6edf3slotTb4b4b4, Te6edf3imgTb4b4b4)Tb4b4b4;
Te6edf3urlToSlotTb4b4b4.Te6edf3setTb4b4b4(Te6edf3urlTb4b4b4, Te6edf3slotTb4b4b4)Tb4b4b4;
Te6edf3pendingTb4b4b4.Tff7b72deleteTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3slotTb4b4b4;
Tb4b4b4}Tb4b4b4)
Tb4b4b4.Tff7b72catchTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3pendingTb4b4b4.Tff7b72deleteTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4;
Te6edf3freeSlotsTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3slotTb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3pendingTb4b4b4.Te6edf3setTb4b4b4(Te6edf3urlTb4b4b4, Te6edf3workTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3workTb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3destroyTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3glTb4b4b4.Te6edf3deleteTextureTb4b4b4(Te6edf3textureTb4b4b4)Tb4b4b4;
Te6edf3urlToSlotTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3pendingTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72return Tb4b4b4{
Te6edf3textureTb4b4b4,
Te6edf3ensureTb4b4b4,
Te6edf3uvForSlotTff7b72: Te6edf3atlasUvForSlotTb4b4b4,
Te6edf3cellUvTff7b72: Tb4b4b4{ Te6edf3xTff7b72: T79c0ff1 Tff7b72/ Te6edf3ATLAS_COLSTb4b4b4, Te6edf3yTff7b72: T79c0ff1 Tff7b72/ Te6edf3ATLAS_ROWS Tb4b4b4}Tb4b4b4,
Te6edf3destroyTb4b4b4,
Te6edf3getSlotTff7b72: Tb4b4b4(Te6edf3urlTb4b4b4) Tb4b4b4=> Te6edf3urlToSlotTb4b4b4.Te6edf3getTb4b4b4(Te6edf3urlTb4b4b4) Tff7b72?? Tff7b72nullTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}

T8b949e/**
* @param {HTMLCanvasElement} canvas
* @param {WebGL2RenderingContext} gl
*/
Tff7b72export Tff7b72function Te6edf3createNetworkVisualiserWebGLTb4b4b4(Te6edf3canvasTb4b4b4, Te6edf3glTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3nodeProg Tff7b72= Te6edf3linkTb4b4b4(Te6edf3glTb4b4b4, Te6edf3NODE_VSTb4b4b4, Te6edf3NODE_FSTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3edgeProg Tff7b72= Te6edf3linkTb4b4b4(Te6edf3glTb4b4b4, Te6edf3EDGE_VSTb4b4b4, Te6edf3EDGE_FSTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3atlas Tff7b72= Te6edf3createIconAtlasTb4b4b4(Te6edf3glTb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3nodeCornerBuf Tff7b72= Te6edf3glTb4b4b4.Te6edf3createBufferTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindBufferTb4b4b4(Te6edf3glTb4b4b4.Te6edf3ARRAY_BUFFERTb4b4b4, Te6edf3nodeCornerBufTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bufferDataTb4b4b4(Te6edf3glTb4b4b4.Te6edf3ARRAY_BUFFERTb4b4b4, Tff7b72new Tffa657Float32ArrayTb4b4b4(Tb4b4b4[Tff7b72-T79c0ff1Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4, T79c0ff1Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4, T79c0ff1Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4, T79c0ff1Tb4b4b4, T79c0ff1Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4, T79c0ff1Tb4b4b4, T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3STATIC_DRAWTb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3nodeInstanceBuf Tff7b72= Te6edf3glTb4b4b4.Te6edf3createBufferTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3edgeBuf Tff7b72= Te6edf3glTb4b4b4.Te6edf3createBufferTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3nodeVao Tff7b72= Te6edf3glTb4b4b4.Te6edf3createVertexArrayTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindVertexArrayTb4b4b4(Te6edf3nodeVaoTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindBufferTb4b4b4(Te6edf3glTb4b4b4.Te6edf3ARRAY_BUFFERTb4b4b4, Te6edf3nodeCornerBufTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3enableVertexAttribArrayTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribPointerTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff2Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3FLOATTb4b4b4, Tff7b72falseTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;

Te6edf3glTb4b4b4.Te6edf3bindBufferTb4b4b4(Te6edf3glTb4b4b4.Te6edf3ARRAY_BUFFERTb4b4b4, Te6edf3nodeInstanceBufTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3strideBytes Tff7b72= Te6edf3NODE_STRIDE Tff7b72* T79c0ff4Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3enableVertexAttribArrayTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribPointerTb4b4b4(T79c0ff1Tb4b4b4, T79c0ff2Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3FLOATTb4b4b4, Tff7b72falseTb4b4b4, Te6edf3strideBytesTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribDivisorTb4b4b4(T79c0ff1Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3enableVertexAttribArrayTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribPointerTb4b4b4(T79c0ff2Tb4b4b4, T79c0ff1Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3FLOATTb4b4b4, Tff7b72falseTb4b4b4, Te6edf3strideBytesTb4b4b4, T79c0ff8Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribDivisorTb4b4b4(T79c0ff2Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3enableVertexAttribArrayTb4b4b4(T79c0ff3Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribPointerTb4b4b4(T79c0ff3Tb4b4b4, T79c0ff4Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3FLOATTb4b4b4, Tff7b72falseTb4b4b4, Te6edf3strideBytesTb4b4b4, T79c0ff12Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribDivisorTb4b4b4(T79c0ff3Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3enableVertexAttribArrayTb4b4b4(T79c0ff4Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribPointerTb4b4b4(T79c0ff4Tb4b4b4, T79c0ff1Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3FLOATTb4b4b4, Tff7b72falseTb4b4b4, Te6edf3strideBytesTb4b4b4, T79c0ff28Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribDivisorTb4b4b4(T79c0ff4Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3enableVertexAttribArrayTb4b4b4(T79c0ff5Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribPointerTb4b4b4(T79c0ff5Tb4b4b4, T79c0ff2Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3FLOATTb4b4b4, Tff7b72falseTb4b4b4, Te6edf3strideBytesTb4b4b4, T79c0ff32Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribDivisorTb4b4b4(T79c0ff5Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindVertexArrayTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3edgeVao Tff7b72= Te6edf3glTb4b4b4.Te6edf3createVertexArrayTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindVertexArrayTb4b4b4(Te6edf3edgeVaoTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindBufferTb4b4b4(Te6edf3glTb4b4b4.Te6edf3ARRAY_BUFFERTb4b4b4, Te6edf3edgeBufTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3enableVertexAttribArrayTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribPointerTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff2Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3FLOATTb4b4b4, Tff7b72falseTb4b4b4, T79c0ff6 Tff7b72* T79c0ff4Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3enableVertexAttribArrayTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3vertexAttribPointerTb4b4b4(T79c0ff1Tb4b4b4, T79c0ff4Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3FLOATTb4b4b4, Tff7b72falseTb4b4b4, T79c0ff6 Tff7b72* T79c0ff4Tb4b4b4, T79c0ff8Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindVertexArrayTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3uNodeRes Tff7b72= Te6edf3glTb4b4b4.Te6edf3getUniformLocationTb4b4b4(Te6edf3nodeProgTb4b4b4, Ta5d6ff"u_resolution"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3uNodeCam Tff7b72= Te6edf3glTb4b4b4.Te6edf3getUniformLocationTb4b4b4(Te6edf3nodeProgTb4b4b4, Ta5d6ff"u_camera"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3uNodeZoom Tff7b72= Te6edf3glTb4b4b4.Te6edf3getUniformLocationTb4b4b4(Te6edf3nodeProgTb4b4b4, Ta5d6ff"u_zoom"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3uNodeAtlas Tff7b72= Te6edf3glTb4b4b4.Te6edf3getUniformLocationTb4b4b4(Te6edf3nodeProgTb4b4b4, Ta5d6ff"u_atlas"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3uNodeCellUv Tff7b72= Te6edf3glTb4b4b4.Te6edf3getUniformLocationTb4b4b4(Te6edf3nodeProgTb4b4b4, Ta5d6ff"u_cellUv"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3uEdgeRes Tff7b72= Te6edf3glTb4b4b4.Te6edf3getUniformLocationTb4b4b4(Te6edf3edgeProgTb4b4b4, Ta5d6ff"u_resolution"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3uEdgeCam Tff7b72= Te6edf3glTb4b4b4.Te6edf3getUniformLocationTb4b4b4(Te6edf3edgeProgTb4b4b4, Ta5d6ff"u_camera"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3uEdgeZoom Tff7b72= Te6edf3glTb4b4b4.Te6edf3getUniformLocationTb4b4b4(Te6edf3edgeProgTb4b4b4, Ta5d6ff"u_zoom"Tb4b4b4)Tb4b4b4;

Tff7b72let Te6edf3cssW Tff7b72= T79c0ff1Tb4b4b4;
Tff7b72let Te6edf3cssH Tff7b72= T79c0ff1Tb4b4b4;
Tff7b72let Te6edf3nodeCount Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72let Te6edf3edgeVertexCount Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72let Te6edf3edgeScratch Tff7b72= Tff7b72new Tffa657Float32ArrayTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;

Tff7b72function Te6edf3resizeTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3dpr Tff7b72= Tffa657MathTb4b4b4.Te6edf3minTb4b4b4(Tffa657windowTb4b4b4.Te6edf3devicePixelRatio Tff7b72|| T79c0ff1Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3rect Tff7b72= Te6edf3canvasTb4b4b4.Te6edf3getBoundingClientRectTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3cssW Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3rectTb4b4b4.Te6edf3width Tff7b72|| Te6edf3canvasTb4b4b4.Te6edf3clientWidth Tff7b72|| T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3cssH Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3rectTb4b4b4.Te6edf3height Tff7b72|| Te6edf3canvasTb4b4b4.Te6edf3clientHeight Tff7b72|| T79c0ff1Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3bw Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff1Tb4b4b4, Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3cssW Tff7b72* Te6edf3dprTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3bh Tff7b72= Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(T79c0ff1Tb4b4b4, Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3cssH Tff7b72* Te6edf3dprTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3canvasTb4b4b4.Te6edf3width Tff7b72!== Te6edf3bw Tff7b72|| Te6edf3canvasTb4b4b4.Te6edf3height Tff7b72!== Te6edf3bhTb4b4b4) Tb4b4b4{
Te6edf3canvasTb4b4b4.Te6edf3width Tff7b72= Te6edf3bwTb4b4b4;
Te6edf3canvasTb4b4b4.Te6edf3height Tff7b72= Te6edf3bhTb4b4b4;
Tb4b4b4}
Te6edf3glTb4b4b4.Te6edf3viewportTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3canvasTb4b4b4.Te6edf3widthTb4b4b4, Te6edf3canvasTb4b4b4.Te6edf3heightTb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{ Te6edf3widthTff7b72: Te6edf3cssWTb4b4b4, Te6edf3heightTff7b72: Te6edf3cssH Tb4b4b4}Tb4b4b4;
Tb4b4b4}

T8b949e/**
* @param {Float32Array} nodes packed NODE_STRIDE
* @param {Float32Array} edges packed EDGE_STRIDE
* @param {{x:number,y:number,zoom:number}} camera
* @param {boolean} dark
*/
Tff7b72function Te6edf3drawTb4b4b4(Te6edf3nodesTb4b4b4, Te6edf3edgesTb4b4b4, Te6edf3cameraTb4b4b4, Te6edf3darkTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3size Tff7b72= Te6edf3resizeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3camX Tff7b72= Te6edf3cameraTff7b72?Tb4b4b4.Te6edf3x Tff7b72?? T79c0ff0Tb4b4b4;
Tff7b72const Te6edf3camY Tff7b72= Te6edf3cameraTff7b72?Tb4b4b4.Te6edf3y Tff7b72?? T79c0ff0Tb4b4b4;
Tff7b72const Te6edf3zoom Tff7b72= Te6edf3cameraTff7b72?Tb4b4b4.Te6edf3zoom Tff7b72> T79c0ff0 Tff7b72? Te6edf3cameraTb4b4b4.Te6edf3zoom Tff7b72: T79c0ff1Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3darkTb4b4b4) Tb4b4b4{
Te6edf3glTb4b4b4.Te6edf3clearColorTb4b4b4(T79c0ff0.035Tb4b4b4, T79c0ff0.035Tb4b4b4, T79c0ff0.04Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3glTb4b4b4.Te6edf3clearColorTb4b4b4(T79c0ff0.973Tb4b4b4, T79c0ff0.98Tb4b4b4, T79c0ff0.988Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3glTb4b4b4.Te6edf3clearTb4b4b4(Te6edf3glTb4b4b4.Te6edf3COLOR_BUFFER_BITTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3enableTb4b4b4(Te6edf3glTb4b4b4.Te6edf3BLENDTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3blendFuncTb4b4b4(Te6edf3glTb4b4b4.Te6edf3SRC_ALPHATb4b4b4, Te6edf3glTb4b4b4.Te6edf3ONE_MINUS_SRC_ALPHATb4b4b4)Tb4b4b4;

Te6edf3nodeCount Tff7b72= Te6edf3nodes Tff7b72&& Te6edf3nodesTb4b4b4.Te6edf3length Tff7b72? Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3nodesTb4b4b4.Te6edf3length Tff7b72/ Te6edf3NODE_STRIDETb4b4b4) Tff7b72: T79c0ff0Tb4b4b4;
Tff7b72const Te6edf3edgeCount Tff7b72= Te6edf3edges Tff7b72&& Te6edf3edgesTb4b4b4.Te6edf3length Tff7b72? Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3edgesTb4b4b4.Te6edf3length Tff7b72/ Te6edf3EDGE_STRIDETb4b4b4) Tff7b72: T79c0ff0Tb4b4b4;

Tff7b72const Te6edf3need Tff7b72= Te6edf3edgeCount Tff7b72* T79c0ff12Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3edgeScratchTb4b4b4.Te6edf3length Tff7b72< Te6edf3needTb4b4b4) Tb4b4b4{
Te6edf3edgeScratch Tff7b72= Tff7b72new Tffa657Float32ArrayTb4b4b4(Tffa657MathTb4b4b4.Te6edf3maxTb4b4b4(Te6edf3needTb4b4b4, T79c0ff64Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3edgeCountTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3o Tff7b72= Te6edf3i Tff7b72* Te6edf3EDGE_STRIDETb4b4b4;
Tff7b72const Te6edf3d Tff7b72= Te6edf3i Tff7b72* T79c0ff12Tb4b4b4;
Tff7b72const Te6edf3x1 Tff7b72= Te6edf3edgesTb4b4b4[Te6edf3oTb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3y1 Tff7b72= Te6edf3edgesTb4b4b4[Te6edf3o Tff7b72+ T79c0ff1Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3x2 Tff7b72= Te6edf3edgesTb4b4b4[Te6edf3o Tff7b72+ T79c0ff2Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3y2 Tff7b72= Te6edf3edgesTb4b4b4[Te6edf3o Tff7b72+ T79c0ff3Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3r Tff7b72= Te6edf3edgesTb4b4b4[Te6edf3o Tff7b72+ T79c0ff4Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3g Tff7b72= Te6edf3edgesTb4b4b4[Te6edf3o Tff7b72+ T79c0ff5Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3b Tff7b72= Te6edf3edgesTb4b4b4[Te6edf3o Tff7b72+ T79c0ff6Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3a Tff7b72= Te6edf3edgesTb4b4b4[Te6edf3o Tff7b72+ T79c0ff7Tb4b4b4]Tb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3dTb4b4b4] Tff7b72= Te6edf3x1Tb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff1Tb4b4b4] Tff7b72= Te6edf3y1Tb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff2Tb4b4b4] Tff7b72= Te6edf3rTb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff3Tb4b4b4] Tff7b72= Te6edf3gTb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff4Tb4b4b4] Tff7b72= Te6edf3bTb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff5Tb4b4b4] Tff7b72= Te6edf3aTb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff6Tb4b4b4] Tff7b72= Te6edf3x2Tb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff7Tb4b4b4] Tff7b72= Te6edf3y2Tb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff8Tb4b4b4] Tff7b72= Te6edf3rTb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff9Tb4b4b4] Tff7b72= Te6edf3gTb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff10Tb4b4b4] Tff7b72= Te6edf3bTb4b4b4;
Te6edf3edgeScratchTb4b4b4[Te6edf3d Tff7b72+ T79c0ff11Tb4b4b4] Tff7b72= Te6edf3aTb4b4b4;
Tb4b4b4}
Te6edf3edgeVertexCount Tff7b72= Te6edf3edgeCount Tff7b72* T79c0ff2Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3edgeVertexCount Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3glTb4b4b4.Te6edf3useProgramTb4b4b4(Te6edf3edgeProgTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3uniform2fTb4b4b4(Te6edf3uEdgeResTb4b4b4, Te6edf3sizeTb4b4b4.Te6edf3widthTb4b4b4, Te6edf3sizeTb4b4b4.Te6edf3heightTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3uniform2fTb4b4b4(Te6edf3uEdgeCamTb4b4b4, Te6edf3camXTb4b4b4, Te6edf3camYTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3uniform1fTb4b4b4(Te6edf3uEdgeZoomTb4b4b4, Te6edf3zoomTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindVertexArrayTb4b4b4(Te6edf3edgeVaoTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindBufferTb4b4b4(Te6edf3glTb4b4b4.Te6edf3ARRAY_BUFFERTb4b4b4, Te6edf3edgeBufTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bufferDataTb4b4b4(Te6edf3glTb4b4b4.Te6edf3ARRAY_BUFFERTb4b4b4, Te6edf3edgeScratchTb4b4b4.Te6edf3subarrayTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3needTb4b4b4)Tb4b4b4, Te6edf3glTb4b4b4.Te6edf3DYNAMIC_DRAWTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3lineWidthTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3drawArraysTb4b4b4(Te6edf3glTb4b4b4.Te6edf3LINESTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3edgeVertexCountTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindVertexArrayTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3nodeCount Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3glTb4b4b4.Te6edf3useProgramTb4b4b4(Te6edf3nodeProgTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3uniform2fTb4b4b4(Te6edf3uNodeResTb4b4b4, Te6edf3sizeTb4b4b4.Te6edf3widthTb4b4b4, Te6edf3sizeTb4b4b4.Te6edf3heightTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3uniform2fTb4b4b4(Te6edf3uNodeCamTb4b4b4, Te6edf3camXTb4b4b4, Te6edf3camYTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3uniform1fTb4b4b4(Te6edf3uNodeZoomTb4b4b4, Te6edf3zoomTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3uniform1iTb4b4b4(Te6edf3uNodeAtlasTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3uniform2fTb4b4b4(Te6edf3uNodeCellUvTb4b4b4, Te6edf3atlasTb4b4b4.Te6edf3cellUvTb4b4b4.Te6edf3xTb4b4b4, Te6edf3atlasTb4b4b4.Te6edf3cellUvTb4b4b4.Te6edf3yTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3activeTextureTb4b4b4(Te6edf3glTb4b4b4.Te6edf3TEXTURE0Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindTextureTb4b4b4(Te6edf3glTb4b4b4.Te6edf3TEXTURE_2DTb4b4b4, Te6edf3atlasTb4b4b4.Te6edf3textureTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindVertexArrayTb4b4b4(Te6edf3nodeVaoTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindBufferTb4b4b4(Te6edf3glTb4b4b4.Te6edf3ARRAY_BUFFERTb4b4b4, Te6edf3nodeInstanceBufTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bufferDataTb4b4b4(Te6edf3glTb4b4b4.Te6edf3ARRAY_BUFFERTb4b4b4, Te6edf3nodesTb4b4b4, Te6edf3glTb4b4b4.Te6edf3DYNAMIC_DRAWTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3drawArraysInstancedTb4b4b4(Te6edf3glTb4b4b4.Te6edf3TRIANGLESTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff6Tb4b4b4, Te6edf3nodeCountTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3bindVertexArrayTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72return Te6edf3sizeTb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3destroyTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3atlasTb4b4b4.Te6edf3destroyTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteBufferTb4b4b4(Te6edf3nodeCornerBufTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteBufferTb4b4b4(Te6edf3nodeInstanceBufTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteBufferTb4b4b4(Te6edf3edgeBufTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteVertexArrayTb4b4b4(Te6edf3nodeVaoTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteVertexArrayTb4b4b4(Te6edf3edgeVaoTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteProgramTb4b4b4(Te6edf3nodeProgTb4b4b4)Tb4b4b4;
Te6edf3glTb4b4b4.Te6edf3deleteProgramTb4b4b4(Te6edf3edgeProgTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72return Tb4b4b4{
Te6edf3drawTb4b4b4,
Te6edf3resizeTb4b4b4,
Te6edf3destroyTb4b4b4,
Te6edf3ensureIconTff7b72: Tb4b4b4(Te6edf3urlTb4b4b4) Tb4b4b4=> Te6edf3atlasTb4b4b4.Te6edf3ensureTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4,
Te6edf3iconUvTff7b72: Tb4b4b4(Te6edf3slotTb4b4b4) Tb4b4b4=> Te6edf3atlasTb4b4b4.Te6edf3uvForSlotTb4b4b4(Te6edf3slotTb4b4b4)Tb4b4b4,
Te6edf3getIconSlotTff7b72: Tb4b4b4(Te6edf3urlTb4b4b4) Tb4b4b4=> Te6edf3atlasTb4b4b4.Te6edf3getSlotTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4,
Te6edf3getCssSizeTff7b72: Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4(Tb4b4b4{ Te6edf3widthTff7b72: Te6edf3cssWTb4b4b4, Te6edf3heightTff7b72: Te6edf3cssH Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}

Tff7b72export Tb4b4b4{ Te6edf3ATLAS_CELLTb4b4b4, Te6edf3ATLAS_COLSTb4b4b4, Te6edf3ATLAS_ROWS Tb4b4b4}Tb4b4b4;


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────